package _220321;

import java.util.Scanner;

/**
 * @author ShadowLim
 * @create 2022-03-21-9:23
 */
public class 蓝桥幼儿园 {
    static int n, m;
//    static int[] arr = new int[n + 1]; ①
    static int[] arr;   // 采用① 会出现init()方法：java.lang.ArrayIndexOutOfBoundsException: 1

    /**
     * 308ms
     * @param args
     */
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        m = scanner.nextInt();
        arr = new int[n + 1];   // 此处声明数组的大小
        init();

        for (int i = 0; i < m; i++) {
            int op = scanner.nextInt();
            int x = scanner.nextInt();
            int y = scanner.nextInt();
            if (op == 1) {
                merge(x, y);
            } else if (op == 2) {
                if (find(x) == find(y)) {
                    System.out.println("YES");
                } else {
                    System.out.println("NO");
                }
            }
        }
    }

    private static int find(int x) {
        if (x != arr[x]) {
            arr[x] = find(arr[x]);  // 路径压缩
        }
        return arr[x];
    }

    private static void merge(int x, int y) {
        x = find(x);
        y = find(y);
        if (x != y) {
            arr[x] = arr[y];
        }
    }

    private static void init() {
        for (int i = 1; i <= n; i++) {
            arr[i] = i;
        }
    }

    /**
     *  290ms
     */
//    static int [] parent;
//    static int [] rank;
//    public static void main(String[] args) {
//        Scanner scan = new Scanner(System.in);
//        int n = scan.nextInt();//学生数量
//        parent = new int[n+1];
//        rank = new int[n+1];
//        for(int i = 1 ; i <= n ;i++) {
//            parent[i] = i;
//            rank[i] = 1;
//        }
//        int m = scan.nextInt();
//        for(int i = 0 ; i < m; i++) {
//            int a = scan.nextInt();
//            int b = scan.nextInt();
//            int c = scan.nextInt();
//            if(a==1) {
//                union(b,c);
//            }else {
//                if(find(b)== find(c)) {
//                    System.out.println("YES");
//                }else {
//                    System.out.println("NO");
//                }
//            }
//        }
//
//
//    }
//    static int find(int p) {
//        //注意是循环
//        while(parent[p]!=p) {
//            parent[p] = parent[parent[p]];
//            p =parent[p];
//        }
//        return p;
//    }
//
//    static void union(int x,int y) {
//        int proot = find(x);
//        int qroot = find(y);
//
//        if(proot== qroot) {
//            return;
//        }
//        //根据两个元素所在树的rank不同判断合并方向
//        //将rank低的集合合并到rank高的集合上
//        if(rank[proot]<rank[qroot]) {
//            parent[proot] = qroot;//proot的父节点为qroot
//            rank[qroot]+=1;
//        }else if(rank[qroot] < rank[proot]) {
//            parent[qroot] = proot;
//            rank[proot]+=1;
//        }else {
//            parent[proot] = qroot;//proot的父节点为qroot,qroot赋值给
//            rank[qroot]+=1;
//        }
//    }


    /**
     * 415ms
     */
//    static int N=200010;
//    static int[] p=new int[N];
//    public static void main(String[] args) {
//        Scanner sc=new Scanner(System.in);
//        int n=sc.nextInt();
//        int m=sc.nextInt();
//        for(int i=1;i<=n;++i) p[i]=i;
//        while(m-->0) {
//            int op=sc.nextInt();
//            int x=sc.nextInt();
//            int y=sc.nextInt();
//            int root1=find(x);
//            int root2=find(y);
//            if(op==1&&root1!=root2) {
//                p[root1]=root2;
//            }else if(op==2) {
//                if(root1==root2) {
//                    System.out.println("YES");
//                }else {
//                    System.out.println("NO");
//                }
//            }
//        }
//    }
//    static int find(int x) {
//        if(p[x]!=x) p[x]=find(p[x]);
//        return p[x];
//    }

}
